前言
好久没写博客了,到新公司差不多一个月了,之前做Android TV 开发,现在开始做手机端了,写手机端App 或许是一个很久的执念吧。
就最近的页面需求,好好研究了一下ViewGroup,RecyclerView 的绘制,这里打算立个flag,记一下自己踩的坑。
先立个自己的思路:
这里再提议嘴,一般我们处理一个view的UI交互,动效,最好来封装控件,从我们的mvp,mvvm等等模式里抽离动画,交互的具体代码!!!!!!!
最近的一个需求
如图所示动画过程:
1.上下滚动是,底图是跟着浮动的(item从头到尾滑动recycerview的高度,但是图片需要滚动全屏距离).
2.点击item,列表展开.
3.底图放大到全屏.
涉及到的知识点
itemDecoration 是什么
这里我们先看看源码:
这里我们看到是直接在recyclerview的画布上用Canvas画出来的,这地方很重要。
ItemView 的绘制
我们可以看源码
可以通过控制这个方法来决定recyclerview itemview的绘制顺序
这里是具体执行recyclerview 绘制itemview的地方
之前我在做recyclerview itemview滑到屏幕中间的时候放大,由于itemview的绘制顺序,放大的itemview会被后面的itemview盖住,这里我通过复写这个方法来完成。
itemview的layout
recyclerview(ViewGroup) 以及 itemview 重绘
对于重绘我们应该多做注意:
1.频繁重绘,会导致vsync信号间隔,gpu来不及绘制framequeue里面的frames,导致丢帧。
2.itemview 重绘会导致Android TV焦点丢失。
3.itemview 重绘,假如外层的viewgroup是wrapcontent,将会导致递归到根节点(宽高给死的viewgroup)的所有view重绘。假如其中有layout位置动画,将会导致动画失效。
4.避免子view重绘制导致上层跟着重绘制,最简单的方式是给定上层viewgroup固定的框高,任你子view变化莫测,我岿然不动,这样就可以保存一些layout的动画状态。
具体的实现方式
拆分动画
recyclerview 展开,收缩动画:
|
|
recyclerview 滚动,itemview 的imageview 的移动动画:
recyclerview:
cardview 继承 ScrollStateCallback:
关键的动画已经基本完成,现在存在一个问题,我上访的titlebar也要动画,消失,这里就不列出代码了,很简单,问题是我的recyclerview 的目标itemview 需要也保持移动来保证跟后面的imageview保持一致:
|
|
手势控制
展开第二级页面,我们要监控手势,往上滑,就控制滑动到webview,在webview状态想上滑,就滑到顶部,漏出imageview。
这里Touch事件的传递方式就不说了。自行google。
webview的基本配置
|
|
总结
之前走了不少坑。这个是PlanB+,之前的心路历程PlanA -> PlanB -> PlanC -> PlanB+。😂
好在看了不少源码,感觉收获挺大的。后续打算还是继续结合具体需求,整理记录知识点儿。